def func1():
    print(abc)


print(123)

# 注意: 我们代码执行时,不会执行函数中的代码,仅记录函数名称,当执行函数调用位置时,才会执行函数体中的代码
# func1() # NameError: name 'abc' is not defined

print('--------------------------------')
# 案例:
# 创建两个函数: 第一个函数就是打印一行横线,第二个函数,就是根据传入的n值打印多行横线, 在第二个函数中调用第一个函数
print(123)


# 再创建一个打印n条横线的方法,内部调用打印一条横线的方法
def print_lines(n):
    for i in range(n):
        print_line()


# 创建打印一条横线的方法
def print_line():
    print('-' * 30)


# 调用print_lines函数, 打印5条横线
print_lines(5)

# 思考: 如果将print_line 和print_lines互换位置会不会报错? 用debug工具进行调试,查看报错/不报错的原因
# 1. 函数的执行顺序,是在程序启动后,从上到下将所有函数的函数名称记录下来保存在内存中,此时不会执行函数体中的代码
# 2. 当我们调用函数时,我们会去刚才记录的函数列表中查询,如果存在,则调用其函数体中的代码,如果不存在,则报错
# 3. 系统内置函数是怎么样加载进来的呢? Python启动时会自动将核心库加载进来.
# 4. 在执行前函数被定义即可,函数定义间的顺序不影响执行结果

